package com.ambitor.grass.sql.dao;

import com.ambitor.grass.sql.data.Parameter;
import com.ambitor.grass.util.data.IData;
import com.ambitor.grass.util.data.IDataset;

public interface SuperDao {

	/**
	 * 在表里新增一行保存data的数据
	 * 
	 * @param tableName
	 * @param data
	 * @return 更新的行数
	 * @throws Exception
	 */
	int insert(String tableName, IData data) throws Exception;

	/**
	 * 在表里新增一行保存data的数据,返回自增的主键ID
	 * 
	 * @param tableName
	 * @param data
	 * @return mysql自增的主键id
	 * @throws Exception
	 */
	String insertAndReturnLastInsertId(String tableName, IData data)
			throws Exception;

	/**
	 * 在表里新增n行保存dataset的数据
	 * 
	 * @param tableName
	 * @param dataset
	 * @return 新增的行数
	 * @throws Exception
	 */
	int[] insert(String tableName, IDataset dataset) throws Exception;

	/**
	 * 根据data中的主键及值设置条件,删除表中的数据
	 * 
	 * @param tableName
	 * @param data
	 * @return 删除的行数
	 * @throws Exception
	 */
	int delete(String tableName, IData data) throws Exception;

	/**
	 * 根据dataset中的主键及值设置条件,删除表中的数据
	 * 
	 * @param tableName
	 * @param dataset
	 * @return 多次删除的行数的结果
	 * @throws Exception
	 */
	int[] delete(String tableName, IDataset dataset) throws Exception;

	/**
	 * 根据keys中指定的主键，结合data中保存的主键值设置条件，去删除表中的数据
	 * 
	 * @param tableName
	 * @param dataset
	 * @return 删除的行数
	 * @throws Exception
	 */
	int delete(String tableName, IData data, String[] keys) throws Exception;

	/**
	 * 操作前先根据data中保存的主键值进行查询，如果表中已经存在主键相同的数据，则更新存在data中的字段数据
	 * 如不存在主键相同的数据，则向表中插入一行新的数据 update只根据条件进行更新，不会insert。
	 * save和update都不会更新不存在data中的字段
	 * 
	 * @param tableName
	 * @param data
	 * @return 成功更新的行数
	 * @throws Exception
	 */
	int save(String tableName, IData data) throws Exception;

	/**
	 * 根据data中的主键及值设置更新的条件，待更新的数据也保存在data中，不在data中的字段值不更新
	 * 
	 * @param tableName
	 * @param data
	 * @return 更新的行数
	 * @throws Exception
	 */
	int update(String tableName, IData data) throws Exception;

	/**
	 * 根据keys中的主键，结合值data中主键的值设置更新的条件，待更新的数据也保存在data中，不在data中的字段不更新
	 * 
	 * @param tableName
	 * @param data
	 * @return 更新的行数
	 * @throws Exception
	 */
	int update(String tableName, IData data, String[] keys) throws Exception;

	/**
	 * 根据dataset中的主键及值更新表中的数据，待更新的数据也保存在dataset中，不在dataset中的字段不更新
	 * 
	 * @param tableName
	 * @param dataset
	 * @return 更新的行数
	 * @throws Exception
	 */
	int[] update(String tableName, IDataset dataset) throws Exception;

	/**
	 * 根据主键查询一行数据
	 * 
	 * @param tableName
	 * @param param
	 * @return IData格式的查询结果
	 * @throws Exception
	 */
	IData queryByPK(String tableName, IData param) throws Exception;

	/**
	 * 根据主键查询一行数据
	 * 
	 * @param tableName
	 * @parma columns表头组成的字符串，以","分割
	 * @param param
	 * @return IData格式的查询结果
	 * @throws Exception
	 */
	IData queryByPK(String tableName, String columns, IData param)
			throws Exception;

	/**
	 * 根据表名查询所有数据
	 * 
	 * @param tableName
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryList(String tableName) throws Exception;

	/**
	 * 根据表名查询当页数据
	 * 
	 * @param tableName
	 * @param start
	 *            起始页数
	 * @param size
	 *            本页行数
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryList(String tableName, int start, int size) throws Exception;

	/**
	 * 根据表名查询所有数据
	 * 
	 * @param tableName
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryList(String tableName, String columns) throws Exception;

	/**
	 * 根据表名查询当页数据
	 * 
	 * @param tableName
	 * @param start
	 *            起始页数
	 * @param size
	 *            本页行数
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryList(String tableName, String columns, int start, int size)
			throws Exception;

	/**
	 * 根据表名和param中的参数查询多行数据
	 * 
	 * @param tableName
	 * @param param
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryList(String tableName, IData param) throws Exception;

	/**
	 * 根据表名和param中的参数查询多行数据，支持分页
	 * 
	 * @param tableName
	 * @param param
	 * @param start
	 *            起始页数
	 * @param size
	 *            本页行数
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryList(String tableName, IData param, int start, int size)
			throws Exception;

	/**
	 * 根据表名和param中的参数查询多行数据
	 * 
	 * @param tableName
	 * @param param
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryList(String tableName, String columns, IData param)
			throws Exception;

	/**
	 * 根据表名和param中的参数查询多行数据，支持分页
	 * 
	 * @param tableName
	 * @param param
	 * @param start
	 *            起始页数
	 * @param size
	 *            本页行数
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryList(String tableName, String columns, IData param,
			int start, int size) throws Exception;

	/**
	 * select count(1) from xx_table where col1 = 'a' and col2 = 'b';
	 * 
	 * @param str表名或者sql语句
	 * @return 查询结果的行数
	 * @throws Exception
	 */
	int getCount(String str) throws Exception;

	/**
	 * select count(1) from xx_table where col1 = ? and col2 = ?;
	 * 
	 * @param str表名或者sql语句
	 * @param data
	 * @return 查询结果的行数
	 * @throws Exception
	 */
	int getCount(String str, Parameter data) throws Exception;

	/**
	 * select count(1) from xx_table where COL1 = :VCOL1 and COL2 = :VCOL2;
	 * 
	 * @param str表名或者sql语句
	 * @param data
	 * @return 查询结果的行数
	 * @throws Exception
	 */
	int getCount(String str, IData data) throws Exception;

	/**
	 * select * from xx_table where col1 = 'a' and col2 = 'b';
	 * 
	 * @param sql
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryListBySql(String sql) throws Exception;

	/**
	 * select * from xx_table where col1 = 'a' and col2 = 'b' limit start,size;
	 * 支持分页
	 * 
	 * @param sql
	 * @param start
	 *            起始记录
	 * @param size
	 *            本页记录数
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryListBySql(String sql, int start, int size) throws Exception;

	/**
	 * select * from xx_table where col1 = ? and col2 = ?;
	 * 
	 * @param sql
	 * @param param
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryListBySql(String sql, Parameter param) throws Exception;

	/**
	 * select * from xx_table where col1 = 'a' and col2 = 'b' limit ?,?; 支持分页
	 * 
	 * @param sql
	 * @param param
	 * @param start
	 *            起始记录
	 * @param size
	 *            本页记录数
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryListBySql(String sql, Parameter param, int start, int size)
			throws Exception;

	/**
	 * select * from xx_table where COL1 = :VCOL1 and COL2 = :VCOL2;
	 * 
	 * @param sql
	 * @param param
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryListBySql(String sql, IData param) throws Exception;

	/**
	 * 根据sql select * from xx_table where COL1 = :VCOL1 and COL2 = :VCOL2 limit
	 * start,size; 支持分页
	 * 
	 * @param sql
	 * @param param
	 *            param中的参数不可以以MIN_NUM或MAX_NUM为key
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset queryListBySql(String sql, IData param, int start, int size)
			throws Exception;

	/**
	 * 根据从sql_sql表中查出待执行的sql，然后执行
	 * 
	 * @param sql
	 * @param param
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset executeBaseOnSqlSql(String tableName, String sqlRef)
			throws Exception;

	/**
	 * 根据从sql_sql表中查出待执行的sql，然后执行，支持分页
	 * 
	 * @param sql
	 * @param start
	 *            起始记录
	 * @param size
	 *            本页记录数
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset executeBaseOnSqlSql(String tableName, String sqlRef, int start,
			int size) throws Exception;

	/**
	 * 根据从sql_sql表中查出待执行的sql，然后执行
	 * 
	 * @param sql
	 * @param param
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset executeBaseOnSqlSql(String tableName, String sqlRef, IData param)
			throws Exception;

	/**
	 * 根据从sql_sql表中查出待执行的sql，然后执行，支持分页
	 * 
	 * @param sql
	 * @param param
	 *            param中的参数不可以以MIN_NUM或MAX_NUM为key
	 * @param start
	 *            起始记录
	 * @param size
	 *            本页记录数
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset executeBaseOnSqlSql(String tableName, String sqlRef, IData param,
			int start, int size) throws Exception;

	/**
	 * 根据从sql_sql表中查出待执行的sql，然后执行
	 * 
	 * @param sql
	 * @param param
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset executeBaseOnSqlSql(String tableName, String sqlRef,
			Parameter param) throws Exception;

	/**
	 * 根据从sql_sql表中查出待执行的sql，然后执行，支持分页
	 * 
	 * @param sql
	 * @param param
	 * @param start
	 *            起始记录
	 * @param size
	 *            本页记录数
	 * @return IDataset格式的查询结果
	 * @throws Exception
	 */
	IDataset executeBaseOnSqlSql(String tableName, String sqlRef,
			Parameter param, int start, int size) throws Exception;

	BaseDao getBaseDao();
	
	void setBaseDao(BaseDao baseDao);

}
